#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <SDL/SDL_mixer.h>
#include <SDL/SDL_ttf.h>  
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>

#define true 1
#define false 0

typedef struct mouvement mouvement;        //structure de mouvement
struct mouvement
{
    int gauche;        //gauche=1 : il y a un mouvement vers la gauche //gauche=0 : il n'y a pas de mouvement vers la gauche
    int droite;        //droite=1 : il y a un mouvement vers la droite //droite=0 : il n'y a pas de mouvement vers la droite
    int sgauche ;
    int sdroite;
};


int collision(int curseur_x,int curseur_y,int lucy_x,int lucy_y)
{
    if (curseur_x+40>= lucy_x

            && curseur_x+40 <= lucy_x +130
            && curseur_y >= lucy_y
            && curseur_y < lucy_y + 200)
        return 1;
    else
        return 0;
}
int collision1(int curseur_x,int curseur_y,int lucy_x,int lucy_y)
{
    if (curseur_x+14>= lucy_x

            && curseur_x+160 < lucy_x +130
            && curseur_y >= lucy_y
            && curseur_y < lucy_y + 200)
        return 1;
    else
        return 0;
}
int collisionpomme(int curseur_x,int curseur_y,int lucy_x,int lucy_y)
{
    if (curseur_x+10>= lucy_x

            && curseur_x+10 < lucy_x +130
            && curseur_y >= lucy_y
            && curseur_y < lucy_y + 250)
        return 1;
    else
        return 0;
}
int collisionfleur(int curseur_x,int curseur_y,int lucy_x,int lucy_y)
{
    if (curseur_x+40>= lucy_x

            && curseur_x+40 < lucy_x +130
            && curseur_y >= lucy_y
            && curseur_y < lucy_y + 250)
        return 1;
    else
        return 0;
}
int collisioncoin(int curseur_x,int curseur_y,int lucy_x,int lucy_y)
{
    if (curseur_x+20>= lucy_x

            && curseur_x+20 < lucy_x +130

            && curseur_y >= lucy_y
            && curseur_y < lucy_y + 250)
        return 1;
    else
        return 0;
}

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{
    //Holds offsets
    SDL_Rect offset;

    //Get offsets
    offset.x = x;
    offset.y = y;

    //Blit
    SDL_BlitSurface( source, NULL, destination, &offset );
}



int main ( int argc, char** argv )
{
    mouvement mvt_bonhomme;

   // FILE *f;
   // f=fopen("/dev/ttyACM0","w+");


sleep(2);

   /*fprintf( f, "1");
   fprintf( f, "2");
   fprintf( f, "3");
   fflush(f);
*/

//Initialisation des structures
    mvt_bonhomme.gauche = 0;
    mvt_bonhomme.droite = 0;



    //Init de la SDL
    SDL_Init( SDL_INIT_VIDEO );

TTF_Init();




    // On crée une fenêtre
    SDL_Surface* ecran = SDL_SetVideoMode(900, 600, 16, SDL_HWSURFACE|SDL_DOUBLEBUF);


    SDL_Surface *mother= NULL,*pomme1= NULL,*pomme2= NULL,*pomme3= NULL, *ennemi1=NULL,*fleur= NULL,*coin= NULL,*coin1= NULL,*coin2= NULL,*coin3= NULL,*coin4= NULL,*texte=NULL,*texte1=NULL;
TTF_Font *police = NULL;
SDL_Color couleurNoire = {0, 0, 0};
 
/*Mix_Chunk *music;
Mix_Volume(1, MIX_MAX_VOLUME/2); 
	/*mother = NULL;
        pomme1 =  NULL;
	pomme2 = NULL;
	pomme3 = NULL;
        ennemi1 = NULL;
        fleur   =NULL;
        coin=NULL;
        coin1=NULL;
        coin2=NULL;
        coin3=NULL;
        coin4=NULL;*/
/*if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 1024) == -1) //Initialisation de l'API Mixer 
   { 
      printf("%s", Mix_GetError()); 
   } 
   Mix_AllocateChannels(32); 
music = Mix_LoadWAV("polenord.ogg"); 
Mix_PlayChannel(1, music, 0); */
  

    SDL_Surface* ennemi = SDL_LoadBMP("enmi1.bmp");
    SDL_Surface* energie = SDL_LoadBMP("e.bmp");
    // On charge le fond
    SDL_Surface* fond = SDL_LoadBMP("fond1.bmp");

    //On charge Mario
    SDL_Surface* mario = SDL_LoadBMP("a.bmp");
    SDL_SetColorKey(mario , (SDL_SRCCOLORKEY | SDL_RLEACCEL), SDL_MapRGB(mario->format,255, 255, 255));


    // La position du fond

    SDL_Rect posfond,pospomme1,pospomme2,pospomme3,posfleur,posennemi,posenergie,posmother,
    poscoin,poscoin1,poscoin2,poscoin3,poscoin4,posennemi1,postexte,postexte1;

    posfond.x = 0;
    posfond.y= 0;


    pospomme1.x = 500;
    pospomme1.y= 200;

    posennemi1.x = 550;
    posennemi1.y= 450;

    posfleur.x = 690;
    posfleur.y= 480;


    pospomme2.x = 300;
    pospomme2.y= 100;



    pospomme3.x = 500;
    pospomme3.y= 80;

    posennemi.x = 700;
    posennemi.y =420;

    posenergie.x = 662;
    posenergie.y= 9;

    posmother.x = 0;
    posmother.y= 0;

    poscoin.x = 220;
    poscoin.y= 530;

    poscoin1.x = 300;
    poscoin1.y= 530;

    poscoin2.x = 380;
    poscoin2.y= 530;

    poscoin3.x = 450;
    poscoin3.y= 530;

    poscoin4.x = 550;
    poscoin4.y= 530;
    
    postexte.x=57;
    postexte.y=13;

    postexte1.x=146;
    postexte1.y=40;


   police = TTF_OpenFont("TouristTrap.ttf", 20); 

   texte = TTF_RenderText_Blended(police,"3", couleurNoire);
   texte1 = TTF_RenderText_Blended(police,"0", couleurNoire);    

    // La position de Mario

    int Xm = 0;
    int Ym = 600-(mario->h);

    // Les variables de la troisieme methode
    double v_x = 1.5;

    double v_grav = 1;
    double v_saut = -20;

    double v_y = v_saut;

    // Boucle principale
    int fin = 0,saut=0,d=0,e=0,g,k=0,i=10000,j=20000;
    SDL_EnableKeyRepeat(5,5);
 

//*
    while (!fin)
    {
//fin = 1 ;sleep(2);
//*


        // Gestion des evenements
        SDL_Event event;
        while (SDL_PollEvent(&event))
        {

            switch (event.type)
            {
            case SDL_QUIT:
                fin = 1;
                break;

            case SDL_KEYDOWN:
            {
                switch(event.key.keysym.sym)    //On regarde quelle est la touche sur laquelle on a appuyé
                {

                case SDLK_RIGHT:
                    mvt_bonhomme.droite = 1;
                    mvt_bonhomme.sdroite = 1 ;
                    mvt_bonhomme.sgauche = 0 ;
                    mvt_bonhomme.gauche = 0;
                    i++;
                    d=1;
                    g=0;
                    break;
                case SDLK_LEFT:
                    mvt_bonhomme.gauche = 1;
                    mvt_bonhomme.droite = 0;
                    mvt_bonhomme.sdroite = 0 ;
                    mvt_bonhomme.sgauche = 1 ;
                    g=1;
                    d=0;
                    i--;
                    break;
                case SDLK_UP:
                    saut=1;
                    break;
                }
            }
            break;
            case SDL_KEYUP:
                switch(event.key.keysym.sym)
                {
                case SDLK_RIGHT: // La flèche droite est relachée
                    mvt_bonhomme.droite = 0;        //On remet la variable à 0 pour empêcher le déplacement
                    break;
                case SDLK_LEFT: // La flèche gauche est relachée
                    mvt_bonhomme.gauche = 0;        //On remet la variable à 0 pour empêcher le déplacement
                    break;
                }
                break;
            }
        }

	

        if (mvt_bonhomme.droite== 1)
        {

            if (i%4==0)
            {
                mario = SDL_LoadBMP("a.bmp");
            }
            else if (i%4==1)
            
            {
                mario = SDL_LoadBMP("c.bmp");
            }
            else if  (i%4==3)
            {
                mario = SDL_LoadBMP("c.bmp");
            }
            Xm = Xm+ v_x +v_x;
            Xm+=0.1;
            Xm++;

            if (Xm > 700)
            {

                Xm = 0 ;
                Ym = 300 ;
                k++;

            }

        }

	

        if (mvt_bonhomme.gauche== 1)
        {
            if (i%4==0)
            {
                mario = SDL_LoadBMP("111.bmp");
            }
            else if (i%4==1)
            {
                mario = SDL_LoadBMP("111.bmp");
            }
            else if  (i%4==2)
            {
                mario = SDL_LoadBMP("333.bmp");
            }
            else if  (i%4==3)
            {
                mario = SDL_LoadBMP("333.bmp");
            }
            Xm = Xm - v_x - v_x;
            Xm--;
            if (Xm < 0)
            {

                Xm = 700 ;
                Ym = 300 ;
                k--;
            }
        }

        if (saut==1)
        {
            // EVOLUTION
            Xm+=2;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
            // Evolution des positions : vive la rigueur !
            if (d == 1)
            {
                Xm++;
                Xm += v_x;
                Ym += v_y;

            }
            else if (g== 1 )
            {
                Xm--;
                Xm -= v_x;
                Ym += v_y;
            }
            else
            {
                Ym += v_y;
            }
            // evolution de la vitesse verticale
            v_y += v_grav;

            if (Ym > 600-(mario->h))
            {
                d=0;
                g=0;
                saut=0;
                v_y = v_saut;

            }

        }
        if (k==0)
        {
            fond = SDL_LoadBMP("fond1.bmp");
            pomme1 =  IMG_Load("pomme.png");
        }
        if (k==1)
        {
            fond = SDL_LoadBMP("fond2.bmp");
            pomme2 =  IMG_Load("pomme.png");
        }

        if (k==2)
        {
            fond = SDL_LoadBMP("fond3.bmp");
           pomme3 =  IMG_Load("pomme.png");
        }
        if (k==3)
        {
            fond = SDL_LoadBMP("fond4.bmp");
            ennemi1 = IMG_Load("enmi3.png");
            fleur = IMG_Load("fleur.png");

            if (collisionfleur(posfleur.x,posfleur.y,Xm,Ym)==1)
            {
                posfleur.x=1000;
                mother = SDL_LoadBMP("mother.bmp");
		//SDL_BlitSurface(mother, 0, ecran, &posmother);
            }
        }

        j--;
        if (j%2==0)
        {
            ennemi = SDL_LoadBMP("enmi1.bmp");
        }
        if (j%2==1)
        {
            ennemi = SDL_LoadBMP("enmi2.bmp");
        }

        if (collision(posennemi.x,posennemi.y,Xm,Ym)==0)
        {
            posennemi.x--;
        }
        else
        {
            posennemi.x+=15;
            e++;
        }

        /*if (collision1(posennemi.x,posennemi.y,Xm,Ym)==0)
        {
            posennemi.x--;
        }
        else
        {
            posennemi.x+=15;

            e++;
        }*/
    if (collisionfleur(posennemi1.x,posennemi1.y,Xm,Ym)==1)
        {
            e++;
posennemi1.x--;
        }


//if (posennemi.x== Xm)
//{e++;}
        if (collisionpomme(pospomme1.x,pospomme1.y,Xm,Ym)==1)
        {
            pospomme1.x=1000;
            e=-2;
        }
        if (collisionpomme(pospomme2.x,pospomme2.y,Xm,Ym)==1)
        {
            pospomme2.x=1000;
            e=-2;
        }
        if (collisionpomme(pospomme3.x,pospomme3.y,Xm,Ym)==1)
        {
            pospomme3.x=1000;
            e=-2;
        }
switch(e)
       {case 0:
        
            energie = SDL_LoadBMP("e.bmp");
	  /*  fprintf( f, "0");
	   fprintf( f, "2");
	   fprintf( f, "3");
	   fflush(f);*/
        
       break;
       case 2:
        
            energie = SDL_LoadBMP("e2.bmp");
	 /*  fprintf( f, "0");
	   fprintf( f, "3");
	   fflush(f);*/
        

       break;
       case 4: 
            energie = SDL_LoadBMP("e3.bmp");
		/*fprintf( f, "0");
		fflush(f);*/
        
        break;
        case 6:
        
            energie = SDL_LoadBMP("e4.bmp");
        
        break;
        case 8:
        
            energie = SDL_LoadBMP("e5.bmp");
        
        break;
        case 10:

        energie = SDL_LoadBMP("e6.bmp");

        break;
        case 12:

        energie = SDL_LoadBMP("e7.bmp");

        break;

        case 14:

        energie = SDL_LoadBMP("e8.bmp");

        break;

        case 16:
       
         energie = SDL_LoadBMP("e9.bmp");
         mother = SDL_LoadBMP("mother1.bmp");
	 SDL_BlitSurface(mother, 0, ecran, &posmother);
        
       break;
        }

        if (collisioncoin(poscoin.x,poscoin.y,Xm,Ym)==1)
        {
        poscoin.x=1000;
        texte1 = TTF_RenderText_Blended(police,"1000", couleurNoire);  
        }
        if (collisioncoin(poscoin1.x,poscoin1.y,Xm,Ym)==1)
        {
            poscoin1.x=1000;
       texte1 = TTF_RenderText_Blended(police,"2000", couleurNoire);  
        }
        if (collisioncoin(poscoin2.x,poscoin2.y,Xm,Ym)==1)
        {
            poscoin2.x=1000;
       texte1 = TTF_RenderText_Blended(police,"3000", couleurNoire);  
        }
        if (collisioncoin(poscoin3.x,poscoin3.y,Xm,Ym)==1)
        {
            poscoin3.x=1000;
       texte1 = TTF_RenderText_Blended(police,"4000", couleurNoire);  
        }
        if (collisioncoin(poscoin4.x,poscoin4.y,Xm,Ym)==1)
        {
            poscoin4.x=1000;
       texte1 = TTF_RenderText_Blended(police,"5000", couleurNoire);  
        }





        if (collisioncoin(poscoin.x,poscoin.y,posennemi.x,posennemi.y)==1)
        {
            poscoin.x=1000;
        }
        if (collisioncoin(poscoin1.x,poscoin1.y,posennemi.x,posennemi.y)==1)
        {
            poscoin1.x=1000;
        }
        if (collisioncoin(poscoin2.x,poscoin2.y,posennemi.x,posennemi.y)==1)
        {
            poscoin2.x=1000;
        }

        if (collisioncoin(poscoin3.x,poscoin3.y,posennemi.x,posennemi.y)==1)
        {
            poscoin3.x=1000;
        }

        if (collisioncoin(poscoin4.x,poscoin4.y,posennemi.x,posennemi.y)==1)
        {
            poscoin4.x=1000;
        }

    



        coin = IMG_Load("coin.png");
        coin1 = IMG_Load("coin.png");
        coin2 = IMG_Load("coin.png");
        coin3 = IMG_Load("coin.png");
        coin4 = IMG_Load("coin.png");


        SDL_FillRect(ecran, 0, SDL_MapRGB(ecran->format, 0, 0, 0));
        SDL_BlitSurface(fond, NULL, ecran, &posfond);
        SDL_SetColorKey(ennemi, SDL_SRCCOLORKEY, SDL_MapRGB(ennemi->format, 51, 51,255));
        SDL_BlitSurface(ennemi, 0, ecran, &posennemi);
        SDL_SetColorKey(mario, SDL_SRCCOLORKEY, SDL_MapRGB(mario->format, 47, 48,130));
        apply_surface(Xm, Ym, mario, ecran);

	if(mother != NULL)
        {SDL_BlitSurface(fleur, 0, ecran, &posfleur);}
	if(pomme1 != NULL)
        {SDL_BlitSurface(pomme1, 0, ecran, &pospomme1);}
	if(pomme2 != NULL)
        {SDL_BlitSurface(pomme2, 0, ecran, &pospomme2);}

	if(pomme3 != NULL)
        {SDL_BlitSurface(pomme3, 0, ecran, &pospomme3);}

	if(coin != NULL)
        {SDL_BlitSurface(coin, 0, ecran, &poscoin);}

	if(coin1 != NULL)
        {SDL_BlitSurface(coin1, 0, ecran, &poscoin1);}

	if(coin2 != NULL)
        {SDL_BlitSurface(coin2, 0, ecran, &poscoin2);}

	if(coin3 != NULL)
        {SDL_BlitSurface(coin3, 0, ecran, &poscoin3);}

	if(coin4 != NULL)
        {SDL_BlitSurface(coin4, 0, ecran, &poscoin4);}

	if(ennemi1 != NULL)
        {SDL_BlitSurface(ennemi1, 0, ecran, &posennemi1);}
        if(texte != NULL)

        {SDL_BlitSurface(texte, NULL, ecran, &postexte);}
        if(texte != NULL)
        {SDL_BlitSurface(texte1, NULL, ecran, &postexte1);}

	if(mother != NULL)
	{SDL_BlitSurface(mother, 0, ecran, &posmother);}
        if(energie != NULL)
        {SDL_BlitSurface(energie, 0, ecran, &posenergie);}


	


        SDL_Flip(ecran);

	//*/

    }



    // Et on soulage la mémoire !
    SDL_FreeSurface(fond);
    SDL_FreeSurface(mario);
    SDL_FreeSurface(ennemi);
    SDL_FreeSurface(energie);
    SDL_FreeSurface(mother);
    SDL_FreeSurface(fleur);
    SDL_FreeSurface(pomme1);//sleep(2);
    SDL_FreeSurface(pomme2);
    SDL_FreeSurface(pomme3);

    SDL_Quit();

//fclose(f);

    
    return 0;
}

